package com.xinke.edu.mypetadoption.fragment.Home;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;

import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.xinke.edu.mypetadoption.Activity.ProductDetailActivity;

import com.chad.library.adapter4.BaseQuickAdapter;
import com.xinke.edu.mypetadoption.databinding.FragmentHomeBinding;
import com.xinke.edu.mypetadoption.entity.Product;
import com.xinke.edu.mypetadoption.entity.ProductCategory;
import com.xinke.edu.mypetadoption.entity.ResultBody;
import com.xinke.edu.mypetadoption.fragment.Home.adpter.ProductAdpter;
import com.xinke.edu.mypetadoption.fragment.Home.adpter.ProductTypeAdpter;
import com.xinke.edu.mypetadoption.util.GridSpacingItemDecoration;
import com.xinke.edu.mypetadoption.util.RetrofitUtil;

import java.util.List;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;

/**
 * 首页Fragment
 * 负责展示商品分类和商品列表，实现商品搜索、分类筛选等功能
 */

public class HomeFragment extends Fragment {
    // 视图绑定对象，用于访问Fragment的UI组件
    FragmentHomeBinding binding;
    // 商品分类适配器，用于显示水平滚动的分类列表
    ProductTypeAdpter adpter;
    // 商品列表适配器，用于显示网格布局的商品数据
    ProductAdpter productAdpter;

    // 商品分类ID，0表示全部商品
    int typeId = 0;
    // 分页参数：当前页码
    int pageIndex = 1;
    // 分页参数：每页显示的商品数量
    int pageSize = 10;

    /**
     * 创建Fragment视图
     * @param inflater 布局填充器，用于将XML布局转换为View对象
     * @param container 父容器
     * @param savedInstanceState 保存的状态数据
     * @return 返回Fragment的根视图
     */
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container ,@Nullable Bundle savedInstanceState){
        binding = FragmentHomeBinding.inflate(inflater);
        return binding.getRoot();
    }

    /**
     * 视图创建完成后的回调方法
     * 初始化UI组件、设置适配器、加载数据
     */
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){
        super.onViewCreated(view, savedInstanceState);
        // 初始化商品分类适配器
        adpter = new ProductTypeAdpter();
        // 设置分类RecyclerView的适配器（XML ID: recyclerview - 水平分类列表）
        binding.recyclerview.setAdapter(adpter);
        // 设置水平滚动的线性布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(getContext());
        manager.setOrientation(LinearLayoutManager.HORIZONTAL);
        binding.recyclerview.setLayoutManager(manager);
        // 加载商品分类数据
        getType();
        // 设置商品分类的点击事件监听（XML ID: recyclerview的item点击）
        adpter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener<ProductCategory>() {
            @Override
            public void onClick(@NonNull BaseQuickAdapter<ProductCategory, ?> baseQuickAdapter, @NonNull View view, int i) {
                // 获取分类数据列表
                List<ProductCategory> datas = adpter.getItems();
                // 遍历所有分类，更新选中状态
                for (int a = 0; a < datas.size();a ++){
                    ProductCategory type = datas.get(a);
                    type.setIsselect(i == a);
                    // 如果是当前点击的分类
                    if (i == a){
                        // 更新选中的分类ID
                        typeId = type.getId();
                        // 重置页码为第一页
                        pageIndex = 1;
                        // 重新加载商品列表数据
                        getProduct();
                    }
                }
                // 通知适配器数据变化，更新UI显示
                adpter.notifyDataSetChanged();
            }
        });

        // 初始化商品列表适配器
        productAdpter = new ProductAdpter();
        // 设置商品列表RecyclerView的适配器（XML ID: recyclerview2 - 商品网格列表）
        binding.recyclerview2.setAdapter(productAdpter);
        // 设置2列的网格布局管理器
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);
        binding.recyclerview2.setLayoutManager(gridLayoutManager);
        // 添加网格间距装饰器，设置间距为10px
        binding.recyclerview2.addItemDecoration(new GridSpacingItemDecoration(2,10,true,0));
        // 加载商品列表数据
        getProduct();
        // 设置商品项的点击事件监听（XML ID: recyclerview2的item点击）
        productAdpter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener<Product>() {
            @Override
            public void onClick(@NonNull BaseQuickAdapter<Product, ?> baseQuickAdapter, @NonNull View view, int i) {
                // 获取当前点击的商品对象
                Product product = productAdpter.getItem(i);
                if (product != null) {
                    // 创建跳转到商品详情页的Intent（XML ID: 通过recyclerview2的item点击获取商品数据）
                    Intent intent = new Intent(getContext(), ProductDetailActivity.class);
                    // 传递完整的Product对象到详情页面
                    intent.putExtra("product", product);
                    // 启动商品详情页面
                    startActivity(intent);
                }
            }
        });
    }

    /**
     * 获取商品列表数据
     * 根据当前选中的分类ID和搜索关键词，通过RetrofitUtil发送网络请求获取商品数据
     */
    public void getProduct() {
        // 获取搜索关键词（XML ID: keySearch - 搜索输入框）
        String keyword = binding.keySearch.getText().toString();
        // 调用API获取商品列表，参数包括：关键词、分类ID、页码、每页数量
        RetrofitUtil.getApi().getProduct(keyword, typeId, pageIndex, pageSize)
                .subscribeOn(Schedulers.io()) // 在IO线程执行网络请求
                .observeOn(AndroidSchedulers.mainThread()) // 在主线程处理响应结果
                .subscribe(new Observer<ResultBody<List<Product>>>() {
                    @Override
                    public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
                        // 订阅成功回调，可以在此处添加加载提示
                    }

                    @Override
                    public void onNext(@io.reactivex.rxjava3.annotations.NonNull ResultBody<List<Product>> listResultBody) {
                        // 获取商品数据列表
                        List<Product> datas = listResultBody.getData();
                        // 根据页码判断是替换列表还是追加数据
                        if (pageIndex == 1) {
                            // 第一页替换整个列表
                            productAdpter.submitList(datas);
                        } else {
                            // 非第一页追加数据
                            productAdpter.addAll(datas);
                        }
                    }

                    @Override
                    public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
                        // 网络请求失败，显示错误信息
                        Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onComplete() {
                        // 网络请求完成，可以在此处隐藏加载提示
                    }
                });
    }

    /**
     * 获取商品分类列表
     * 通过RetrofitUtil发送网络请求获取所有商品分类数据
     */
    public void getType() {
        // 调用API获取商品分类列表
        RetrofitUtil.getApi().getType()
                .subscribeOn(Schedulers.io()) // 在IO线程执行网络请求
                .observeOn(AndroidSchedulers.mainThread()) // 在主线程处理响应结果
                .subscribe(new Observer<ResultBody<List<ProductCategory>>>() {
                    @Override
                    public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
                        // 订阅成功回调
                    }

                    @Override
                    public void onNext(@io.reactivex.rxjava3.annotations.NonNull ResultBody<List<ProductCategory>> listResultBody) {
                        // 获取分类数据列表
                        List<ProductCategory> datas = listResultBody.getData();
                        // 创建"全部"分类，并设置为选中状态
                        ProductCategory productCategory = new ProductCategory();
                        productCategory.setId(0);
                        productCategory.setName("全部");
                        productCategory.setIsselect(true);
                        // 将"全部"分类添加到列表首位
                        datas.add(0, productCategory);
                        // 设置数据到适配器
                        adpter.addAll(datas);
                    }

                    @Override
                    public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
                        // 网络请求失败，显示错误信息
                        Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onComplete() {
                        // 网络请求完成
                    }
                });
    }

    /**
     * Fragment视图销毁时的回调方法
     * 释放ViewBinding资源，避免内存泄漏
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}